اکثر ما به خرید کریپتو از طریق صرافی های متمرکز - بایننس، کوین بیس و غیره عادت داریم.
با این حال، مبادلات متمرکز مملو از مشکلات هستند. آنها می توانند هک شوند و تمام پول کاربر خود را از دست بدهند، یا بدتر از آن، شرکت پشت صرافی می تواند مغازه را ببندد و با تمام پول فرار کند.
این ممکن است افراطی به نظر برسد، اما این تخیلی نیست.
Mt. Gox
Mt. Gox پیشروترین صرافی بیت کوین از سال 2010 تا 2014 بود. در اوج خود، مسئول 70 درصد از کل تراکنش های بیت کوین بود. در اوایل سال 2014، این شرکت گزارش داد که صدها هزار بیت کوین از دست رفته است و اعلام ورشکستگی کرد. امروز، آن بیت کوین از دست رفته میلیاردها دلار ارزش دارد.
در سال های بعد، Mt. Gox با چندین پرونده قضایی مواجه شد که برخی از آنها هنوز پس از 8 سال ادامه دارد. در اینجا می توانید اطلاعات بیشتری در مورد آنچه که با Mt. Gox اتفاق افتاد را بخوانید
QuadrigaCX
QuadrigaCX، یک صرافی متمرکز مستقر در کانادا، در سال 2018 از کار افتاد. بنیانگذار Quadriga به طور مرموزی "درگذشت" و تمام رمزارزهای این پلتفرم با او ناپدید شدند. کاربران گزارش کردند که تقریباً 200 میلیون دلار از دست رفته است.
کمیسیون اوراق بهادار انتاریو تحقیقات کاملی در مورد فعالیت های شرکت انجام داد و اعلام کرد که بنیانگذار Quadriga به سادگی یک کلاهبردار بوده است.
این به هیچ وجه فهرست جامعی نیست، اما به شما ایده می دهد. Web3 یک ضرب المثل رایج دارد
نه کلیدهای شما، نه سکه های شما
این بدان معناست که اگر شما مالک کلیدهای خصوصی خود نباشید، و در عوض به یک صرافی متمرکز اعتماد کنید تا آنها را برای شما مدیریت کند، واقعاً مالک سکه های ارز دیجیتال خود نیستید. درست است.
تولد مبادلات غیرمتمرکز
ایده یک صرافی غیرمتمرکز ساده است - به کاربران اجازه دهید رمزارز خود را مستقیماً در زنجیره از طریق قراردادهای هوشمند معامله کنند بدون اینکه کنترل کلیدهای خصوصی خود را از دست بدهند.
در حالی که ساده به نظر می رسد، واقعیت بسیار پیچیده تر است. به طور خلاصه، صرافی های غیرمتمرکز یک قطعه زیبا از ریاضیات و نرم افزار هستند که با هم ترکیب شده اند. امیدواریم تا پایان این مقاله شما نیز همین احساس را داشته باشید.
تولد صرافی های غیرمتمرکز مدرن عمدتاً توسط Uniswap رهبری شد. Uniswap نه تنها صرافی غیرمتمرکز پیشرو در اتریوم است، بلکه به طور کلی dApp پیشرو در اتریوم است.
پس از اینکه Vitalik Buterin در سال 2017 یک پست وبلاگی در مورد Path Independence ارسال کرد، هیدن آدامز الهام گرفت تا سعی کند ایده های Vitalik را در چیزی که در نهایت به Uniswap تبدیل شد، پیاده کند.
پس از گذراندن بیش از یک سال کار روی کد ، هایدن سرانجام در نوامبر 2018 UnisWap را اعلام و راه اندازی کرد. می توانید اطلاعات بیشتری در مورد تاریخچه UnisWap در این پست وبلاگ توسط بنیانگذار بخوانید.
در این مقاله ، ما تلاش خواهیم کرد تا ریاضیات را که امکان وجود و عملکرد Uniswap را فراهم می کند ، پیش برویم و امیدواریم که به شما بینشی بدهد که چرا اینقدر شگفت انگیز است.
چرا پیچیده است؟
ممکن است تعجب کنید - "چرا ما نمی توانیم فقط یک زنجیره مبادله متمرکز را دوباره از بین ببریم؟"
خوب ، شما می توانید ، اما به اندازه کافی خوب نیست.
مبادلات متمرکز به طور معمول بر روی یک سیستم سفارش کتاب کار می کنند. آلیس لیستی را بیان می کند که می گوید مایل به فروش 100 "Tokena" برای 50 "Tokenb" است ، و لیست به کتاب سفارش اضافه می شود. در بعضی مواقع ، اگر باب همراه شود و می گوید می خواهد 100 "Tokena" را برای 50 "Tokenb" خریداری کند - سفارشات آنها با هم همسان می شوند و تجارت اجرا می شود.
مبادلات مبتنی بر کتاب در اتریوم انجام شد که مهمترین نمونه آن 0xProject بود اما به دلیل گاز بالای مورد نیاز برای تمام الگوریتم های ذخیره سازی و تطبیق ، جذب کاربران چالش برانگیز بود.
نیاز به یک رویکرد جدید وجود دارد ، راهی برای امکان تعویض کاربران بین هر دو نشانه خودسرانه و بدون نیاز به کتاب سفارش. علاوه بر این ، اگر کاربران بتوانند با استفاده از UNISWAP درآمد کسب کنند.
Uniswap v1 ، v2 ، v3
از ژانویه سال 2022 ، سه نسخه از Uniswap راه اندازی شده است.
نسخه اول در نوامبر 2018 راه اندازی شد و فقط مبادله ای بین اتر و یک نشانه امکان پذیر بود. مبادلات زنجیره ای نیز امکان پذیر بود تا مبادلات توکن را به دست آورد. تعویض زنجیره ای باعث می شود یک توکنا<>مبادله توکن با تعویض اول یکی از آنها برای ETH ، و سپس تعویض ETH برای نشانه دوم.
V2 در مارس 2020 راه اندازی شد و این یک پیشرفت بزرگ V1 بود که امکان مبادله مستقیم بین هر نشانه ERC20 و همچنین تعویض زنجیره ای بین هر جفت را فراهم می آورد.
V3 در ماه مه 2021 راه اندازی شد و به طور قابل توجهی راندمان سرمایه را بهبود بخشید ، که به ارائه دهندگان نقدینگی اجازه می داد بخش بزرگی از نقدینگی آنها را از استخرها حذف کنند و هنوز هم همان پاداش ها را دریافت کنند (یا سرمایه را در محدوده قیمت های کوچکتر فشار داده و تا 4000 برابر سود کسب کنند.).
برای اهداف این آموزش ، ما به طراحی Uniswap V1 توجه خواهیم کرد و در سطح زیر ما در واقع یک نسخه کمی ساده از آن را اجرا خواهیم کرد که امکان تعویض بین اتر و یک نشانه را فراهم می کند.
سازندگان
Uniswap یک سازنده بازار خودکار است. بیایید سعی کنیم بفهمیم این به چه معنی است.
سازندگان بازار نهادهایی هستند که نقدینگی (دارایی) را برای بازارهای تجاری فراهم می کنند. در سیستم های غیر دفترچه ، نقدینگی همان چیزی است که امکان تجارت را فراهم می کند. این بدان معناست که اگر می خواهید BTC را برای خرید ETH بفروشید ، مبادله باید در ازای BTC تعادل ETH داشته باشد که می توانید از آن خریداری کنید. برخی از جفت های معاملاتی نقدینگی بسیار بالایی دارند (به عنوان مثال BTC<>جفت معاملات ETH) ، اما برخی از آنها به هیچ وجه نقدینگی بسیار کم و یا بدون آن ندارند (به عنوان مثال نشانه های کلاهبرداری یا نشانه های تازه ایجاد شده).
DEX باید نقدینگی کافی برای عملکرد داشته باشد و به عنوان جایگزینی برای مبادلات متمرکز عمل کند.
یکی از راه های دستیابی به نقدینگی این است که توسعه دهندگان (یا سرمایه گذاران) پول خود را در آن قرار داده و سازنده بازار می شوند. با این حال ، این واقع بینانه نیست زیرا آنها به پول زیادی نیاز دارند تا نقدینگی کافی را برای همه جفت های تجاری ممکن فراهم کنند. علاوه بر این ، این به عدم تمرکز آسیب می رساند ، زیرا توسعه دهندگان/سرمایه گذاران تمام قدرت را در بازار نگه می دارند.
راه دیگر ، که Uniswap اجرا کرد ، این بود که به هر کسی اجازه دهد که یک بازار ساز باشد - و این همان چیزی است که UnisWap را به عنوان سازنده بازار خودکار تبدیل می کند. هر کاربر می تواند وجوه را به یک جفت تجارت خاص واریز کند و نقدینگی را اضافه کند و در عوض برای انجام این کار از طریق هزینه های معاملاتی که از کاربران گرفته شده است ، درآمد کسب می کند.
الزامات عملکردی
با توجه به آنچه آموخته ایم ، باید حداقل برای ساخت یک سازنده بازار خودکار ، عملکرد زیر را فراهم کنیم:
- هرکسی می تواند نقدینگی را اضافه کند تا به یک ارائه دهنده نقدینگی تبدیل شود
- ارائه دهندگان نقدینگی می توانند نقدینگی خود را از بین ببرند و هر زمان که بخواهند رمزنگاری خود را برگردانند
- کاربران می توانند بین دارایی های موجود در استخر تجارت مبادله کنند ، با فرض اینکه نقدینگی کافی وجود دارد
- به کاربران هزینه معاملاتی کوچک پرداخت می شود ، که بین ارائه دهندگان نقدینگی توزیع می شود تا بتوانند برای تأمین نقدینگی درآمد کسب کنند
xy = k
در هسته uniSwap یک عملکرد ریاضی است:
فرض کنید ما یک جفت معاملاتی برای ETH داریم<>نشانه LW3
x = مانده رزرو ETH در استخر معاملات
y = مانده ذخیره توکن LW3 در استخر معاملات
k = ثابت
این فرمول وظیفه محاسبه قیمت ها را بر عهده دارد ، تصمیم می گیرد که در ازای مقدار معینی از ETH یا برعکس ، چه مقدار نشانه LW3 دریافت می شود.
توجه: فرقی نمی کند که از X برای نشان دادن ذخیره ETH یا LW3 استفاده کنیم تا زمانی که y برعکس باشد.
این فرمول بیان می کند که K مهم نیست که ذخایر (X و Y) چیست. هر مبادله ای باعث افزایش ذخیره ETH یا LW3 می شود و ذخیره دیگری را کاهش می دهد.
بیایید سعی کنیم آن را به عنوان یک فرمول بنویسیم:
(x + Δx) * (y - Δy) = k
جایی که Δx مبلغی است که توسط کاربر برای فروش ارائه می شود ، و ΔY مبلغی است که کاربر در ازای ΔX از DEX دریافت می کند.
از آنجا که K یک ثابت است ، می توانیم دو فرمول فوق را برای بدست آوردن مقایسه کنیم:
x * y = (x + Δx) * (y - Δy)
اکنون ، قبل از وقوع مبادله ، مقادیر x ، y و Δx (داده شده توسط کاربر) را می دانیم. ما علاقه مند به محاسبه ΔY هستیم - که میزان ETH یا LW3 نشانه ای است که کاربر دریافت می کند.
ما می توانیم معادله فوق را برای حل ΔY ساده کنیم و فرمول زیر را دریافت می کنیم:
Δy = (y * Δx) / (x + Δx)
بیایید سعی کنیم این را در استحکام کدگذاری کنیم.
از حالت تمام صفحه خارج شوید
فرض کنید ما در قرارداد 100 نشانه ETH و 200 LW3 داریم.
چه اتفاقی می افتد اگر بخواهم 1 ETH را برای نشانه های LW3 مبادله کنم؟بیایید ریاضی را انجام دهیم.
inputAmount = 1 ETH inputReserve = 100 ETH outputReserve = 200 نشانه LW3
=>OutputAmount = 1. 98019802 LW3 TOKENS
چه اتفاقی می افتد اگر در عوض من می خواستم 2 نشانه LW3 را برای ETH تعویض کنم؟
inputAmount = 2 LW3 Tokens InputReserve = 200 Tokens LW3 OutputReserve = 100 ETH
=>outputamount = 0. 999 ETH
این مقادیر بسیار نزدیک به نسبت 1: 2 از نشانه های موجود در ذخایر قرارداد هستند ، اما کمی کوچکتر هستند. چرا؟
فرمول محصولی که ما برای محاسبات قیمت استفاده می کنیم در واقع یک hyperbola است.

Hyperbola هرگز در x = 0 یا y = 0 تقاطع نمی کند - این بدان معنی است که هیچکدام از ذخایر هرگز به عنوان یک محصول تجارت 0 نخواهد بود! ذخایر بی نهایت است
لغزش
از آنجا که ما به نسبت دقیق ذخایر نشانه نمی گیریم ، این منجر به پیامدهای جالب ریاضی می شود. عملکرد قیمت باعث کاهش قیمت در قیمت می شود.
هرچه میزان نشانه های تجاری نسبت به ارزش ذخیره آنها بزرگتر باشد ، قیمت آن نیز کمتر خواهد بود.
بیایید بگوییم که من می خواستم سعی کنم کل استخر را تخلیه کنم و 200 ETH بفروشم.
inputAmount = 200 ETH inputReserve = 100 ETH outputReserve = 200 نشانه LW3
=>OutputAmount = 133. 333 LW3 TOKENS
همانطور که می بینید ، وقتی می خواهیم استخر را تخلیه کنیم ، فقط نیمی از آنچه را که انتظار داریم نزدیک می شویم.
برخی ممکن است این را به عنوان نقص سازندگان خودکار بازار که از x*y = k پیروی می کنند ، ببینند ، اما در واقع اینگونه نیست. این همان مکانیسم است که استخرها را از تخلیه کامل محافظت می کند. این همچنین با قانون عرضه و تقاضا هماهنگ است: هرچه تقاضا نسبت به عرضه بیشتر باشد ، خرید آن عرضه هزینه بیشتری دارد.
چه کسی قیمت اولیه را تعیین می کند؟
هنگامی که یک رمزنگاری جدید ایجاد می شود ، هیچ نقدینگی برای جفت های تجاری مربوط به آن نشانه وجود ندارد. به همین ترتیب ، هیچ راهی برای محاسبه قیمت آن وجود ندارد.
بنابراین ، اولین کسی که نقدینگی را به استخر اضافه می کند ، قیمت را تعیین می کند. اضافه کردن نقدینگی شامل اضافه کردن نشانه ها از هر دو طرف جفت تجارت است - شما نمی توانید نقدینگی را فقط برای یک طرف اضافه کنید.
هنگامی که شخص اول نقدینگی را اضافه می کند ، تعادل ذخیره ایجاد می کند و مقادیر اولیه X و Y را تعیین می کند. از آن نقطه به بعد ، ما می توانیم هنگام تعویض بین نشانه ها ، محاسبات قیمت را انجام دهیم.
اجرای ساده عملکرد افزودنی در استحکام چیزی شبیه به این است:
از حالت تمام صفحه خارج شوید
این عملکرد ETH و یک نشانه را از کاربر می پذیرد.
با این حال ، این اجرای ناقص است!
شخص دوم می تواند همراه باشد و نقدینگی را در نسبت کاملاً متفاوتی از ذخایر اضافه کند که به طور گسترده ای بر محاسبات قیمت تأثیر می گذارد. ما نمی خواهیم چنین دستکاری قیمت را مجاز کنیم و می خواهیم قیمت های مبادله غیرمتمرکز به همان اندازه نزدیک به مبادلات متمرکز باشد.
بنابراین ما باید اطمینان حاصل کنیم که هرکسی که نقدینگی اضافی به استخر اضافه کند ، این کار را به همان نسبت آنچه قبلاً در استخر ایجاد کرده است انجام می دهد. ما فقط می خواهیم در هنگام خالی بودن استخر ، نسبت های دلخواه را اجازه دهیم.
این منجر به اجرای آن می شود که به نظر می رسد:
از حالت تمام صفحه خارج شوید
نشانه های LP
تاکنون ما در مورد چگونگی اضافه کردن نقدینگی و نحوه انجام محاسبات قیمت برای مبادلات بحث کرده ایم. اما اگر یک ارائه دهنده نقدینگی بخواهد نقدینگی خود را از استخر خارج کند ، چه می شود؟
ما به راهی برای پاداش دادن به ارائه دهندگان نقدینگی برای نشانه های خود نیاز داریم ، زیرا بدون آنها کاربران دیگر قادر به انجام تعویض نبودند. اگر چیزی از آن خارج نشود ، هیچ کس نشانه های شخص ثالث را در یک قرارداد شخص ثالث قرار نمی دهد.
تنها راه حل خوب برای این کار جمع آوری هزینه کمی در هر مبادله توکن و توزیع هزینه ها در بین ارائه دهندگان نقدینگی ، بر اساس میزان نقدینگی آنها است.
اگر شخصی 50 ٪ از نقدینگی استخر را تأمین کند ، باید 50 ٪ از هزینه ها را دریافت کند. منطقی است
یک راه حل کاملاً زیبا برای انجام این کار وجود دارد: نشانه های ارائه دهنده نقدینگی (نشانه های LP)
نشانه های LP به عنوان سهام کار می کنند.
- شما در ازای نقدینگی خود LP-Tokens دریافت می کنید
- مقدار نشانه هایی که می گیرید متناسب با سهم شما از نقدینگی در استخر است
- هزینه ها متناسب با تعداد LP-Tokens شما هستند
- LP-Tokens را می توان برای نقدینگی + هزینه های کسب شده رد و بدل کرد
اما ، الزامات اضافی وجود دارد:
- سهام صادر شده همیشه باید صحیح باشد. هنگامی که شخص دیگری پس از شما نقدینگی را سپرده یا از بین می برد ، سهام شما باید باقی بماند و مقادیر صحیح را حفظ کند.
- نوشتن داده ها در زنجیره می تواند گران باشد (کارمزد گاز) - ما می خواهیم هزینه های نگهداری توکن های LP را تا حد امکان کاهش دهیم.
تصور کنید ما توکن های زیادی صادر می کنیم - مثلاً چند میلیارد. اولین باری که شخصی نقدینگی را اضافه می کند، مالک 100 درصد نقدینگی موجود در استخر است. پس آیا به همه آنها چند میلیارد توکن می دهیم؟
این منجر به این مشکل می شود که وقتی شخص دوم نقدینگی اضافه می کند، سهام باید دوباره محاسبه شود که به دلیل کارمزد گاز گران است.
از طرف دیگر، اگر تصمیم بگیریم در ابتدا فقط بخشی از توکن ها را توزیع کنیم، خطر رسیدن به حد مجاز را داریم که در نهایت ما را مجبور به محاسبه مجدد سهام موجود می کند.
به نظر می رسد تنها راه حل خوب این است که اصلاً محدودیت عرضه ندارد و هر زمان که نقدینگی جدید اضافه می شود، توکن های جدیدی ایجاد کنید. این امکان رشد بی نهایت را فراهم می کند، و اگر محاسبه را با دقت انجام دهیم، می توانیم مطمئن شویم که سهام منتشر شده هر زمان که نقدینگی اضافه یا حذف شود، درست باقی می مانند.
بنابراین، چگونه می توانیم مقدار توکن های LP را هنگام اضافه شدن نقدینگی محاسبه کنیم؟
Uniswap V1 مقدار متناسب با ذخیره ETH را محاسبه می کند. معادله زیر نشان می دهد که چگونه مقدار توکن های LP جدید بسته به مقدار ETH سپرده شده محاسبه می شود:
مقدار منتخب = مقدار کل * (ethDeposited / ethReserve)
وقتی نقدینگی اضافه می شود، می توانیم تابع addLiquidity را برای برش توکن های LP به روزرسانی کنیم:
از حالت تمام صفحه خارج شوید
اکنون ما توکن های LP داریم، همچنین می توانیم از آن ها برای محاسبه مقدار توکن زیربنایی برای بازگرداندن زمانی که شخصی می خواهد نقدینگی خود را در ازای توکن های LP خود برداشت کند، استفاده کنیم.
لازم نیست به یاد بیاوریم که آنها در ابتدا چقدر سپرده گذاری کردند. از آنجایی که توکن های LP متناسب با مقدار اتریوم واریز شده هستند، می توانیم فرمول بالا را برای محاسبه مقدار ETH برای بازگشت و به طور متناسب مقدار توکن های بازگشتی را محاسبه کنیم.
اکنون برای جمع آوری کارمزدهای سوآپ و توزیع آن بین ارائه دهندگان نقدینگی، باید به چند نکته فکر کنیم:
- آیا هزینه ها را به صورت ETH یا توکن جمع آوری می کنیم؟
- آیا پاداش را به صورت ETH یا توکن می پردازیم؟
- چگونه کارمزد هر سوآپ را دریافت کنیم؟
- چگونه کارمزدها را بین تمام تامین کنندگان نقدینگی توزیع کنیم؟
ممکن است پاسخ به این سوالات دشوار به نظر برسد، اما ما در واقع همه چیزهایی را که برای پاسخ به آنها نیاز داریم در اختیار داریم.
- معامله گران در حال حاضر اتر/توکن ها را به قرارداد ارسال می کنند. به جای درخواست هزینه صریح، فقط می توانیم مقداری از اتر/توکن هایی که ارسال می کنند کم کنیم.
- ما فقط می توانیم هزینه ها را به موجودی ذخیره اضافه کنیم. این بدان معناست که با گذشت زمان، ذخایر رشد خواهند کرد!
- ما می توانیم هزینه های دارایی را که توسط معامله گر واریز می شود ، جمع آوری کنیم. بنابراین ارائه دهندگان نقدینگی مقدار متعادل اتر و نشانه های متناسب با سهم خود از LP-Tokens را دریافت می کنند.
UNISWAP از هر مبادله 0. 03 ٪ هزینه می گیرد. بیایید بگوییم که ما 1 ٪ طول می کشد تا کارها را ساده نگه داریم. افزودن هزینه به قرارداد به سادگی ساختن چند ویرایش به فرمول محاسبه قیمت ما است:
ما OutputAmount = (outputReserve * inputAmount) / (InputReserve + InputAmount) داشتیم
outputamountwithfees = 0. 99 * outputamount
اما ، استحکام از عملیات نقطه شناور پشتیبانی نمی کند. بنابراین برای استحکام ما فرمول را به این ترتیب بازنویسی می کنیم:
outputamountwithfees = (OutputAmount * 99) / 100
تبریک می گویم!
این یک آموزش بزرگ با اطلاعات متراکم زیادی بود. تبریک می گویم که این کار را تا کنون انجام داد!
در حالی که ریاضیات و ایده ها می توانند برای درک در ابتدا کمی مشکل باشند ، امیدواریم که با عبور از مطالب و پرسیدن سؤالاتی در مورد اختلاف نظر ، می توانید قدردانی کنید که همه این موارد به زیبایی معمار شده است.
شما را در سطح بعدی می بینیم که در واقع ما قرارداد کامل را به همراه یک وب سایت برای DEX پیاده سازی خواهیم کرد.

این مقاله توسط LeaWeb3 DAO برای شما آورده شده است. یک برنامه آموزشی رایگان و جامع A تا Z blockchain برای توسعه دهندگان در سراسر جهان.
همه چیز از "What Is A Blockchain" تا "هک کردن قراردادهای هوشمند" - و همه چیز در بین ، بلکه خیلی بیشتر! اکنون به ما بپیوندید تا با 25،000+ سازنده شروع به کار کنید.
استراتژی ترید...
ما را در سایت استراتژی ترید دنبال می کنید
برچسب :
نویسنده : مرجان شیرمحمدی
بازدید : 76
تاريخ : سه
شنبه
26 ارديبهشت
1402 ساعت: 17:44